#include <string.h>
#include <unistd.h>
#include <iostream>
#include <sstream>
#include <Client.h>
#include <mensajes.h>

using namespace std;

Client::Client() :
		isActive(true) {
	log = Logger::getInstance();
}

Client::~Client() {
}

mensaje_st Client::createMessage(short operationId, persona_st person) {
	log->log(INFO, "[Client] Comienzo a crear el mensaje a enviar");
	mensaje_st message;
	std::stringstream s;

	memset(&message, 0, sizeof(mensaje_st));
	message.mtype = 1;
	message.pidSender = getpid();
	message.idOperation = operationId;

	memcpy(message.messageText, person.nombre, 61);
	memcpy(message.messageText + 61, person.direccion, 120);
	memcpy(message.messageText + 61 + 120, person.telefono, 13);

	s << "opId:" << operationId << " n:" << person.nombre << " d:"
			<< person.direccion << " t:" << person.telefono;

	log->log(INFO, "[Client] Mensaje creado, " + s.str());

	return message;
}

void Client::processReply(mensaje_st reply) {

	log->log(INFO, "[Client] Parseo respuesta del server");
	if (reply.idOperation == SUCCESSFULL_RESPONSE_WITHOUT_TEXT
			|| reply.idOperation == SUCCESSFULL_RESPONSE_CONSULT) {
		log->log(INFO, "[Client] Respuesta del server: operacion exitosa");
		std::cout << std::endl;
		std::cout << "************************" << std::endl;
		std::cout << "Operacion exitosa" << std::endl;

		if (reply.idOperation == SUCCESSFULL_RESPONSE_CONSULT) {

			log->log(INFO,"[Client] Respuesta de operacion consulta");
			persona_st person;
			memcpy(person.nombre, reply.messageText, 61);
			memcpy(person.direccion, reply.messageText + 61, 120);
			memcpy(person.telefono, reply.messageText + 61 + 120, 13);

			std::cout << std::endl;
			std::cout << "**** Consulta efectuada **** " << std::endl;
			std::cout << "[Nombre]: " << person.nombre << std::endl;
			std::cout << "[Dirección]: " << person.direccion << std::endl;
			std::cout << "[Telefono]: " << person.telefono << std::endl;
		}
	} else {
		log->log(ERROR,"[Client] Respuesta del server: operacion fallida");
		std::cout << std::endl;
		std::cout << "************************" << std::endl;
		std::cout << "Operacion inválida" << std::endl;
		std::cout << "Error obtenido: " << reply.messageText << std::endl;
	}

	std::cout << "Presione ENTER para continuar" << std::endl;
	cin.ignore();
}

void Client::sendRequest(short operationId, persona_st person) {
	std::stringstream s;
	mensaje_st message = this->createMessage(operationId, person);

	s << operationId;
	log->log(INFO,
			"[Client] Escribiendo mensaje en la cola con Id: " + s.str());
	cola.escribir(&message);
	log->log(INFO, "[Client] Mensaje escrito en la cola");
	mensaje_st reply;
	log->log(INFO, "[Client] Espero respuesta del server");
	cola.leer(getpid(), &reply);
	log->log(INFO, "[Client] Respuesta recibida");
	processReply(reply);

}

